#include "stm32f10x.h"                  // Device header

uint16_t Count;

void CountSensor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);			//开启时钟GPIOB
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);			//开启时钟AFIO，EXTI和NVIC没有时钟开启，不需要
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);						//将PA1和PA2引脚初始化为推挽输出
	
	/*AFIO数据选择器*/
	//void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);这个就是 AFIO 的中断引脚配置函数，
	//GPIO_PortSource就是使用哪一个中断GPIO口 ，GPIO_PinSource就是使用哪一个引脚
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//就是B口14号引脚
	
	/*EXTI配置*/
	/*这四个是用来看标志位的，就是中断挂起不是会有标志位嘛，就用这个函数看
	FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
	void EXTI_ClearFlag(uint32_t EXTI_Line);
	上面两个是啥地方都能用，主程序啥的
	下面两个是中断函数里面用的
	ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
	void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
	*/
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line14;					//这个是设置EXTI口的哪一个中断线接收
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;						//使能，看开不开EXTI
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;			//EXTI的模式，选的是中断模式，不是时间触发模式
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;		//高低电平触发。EXTI_Trigger_Falling低电平触发，EXTI_Trigger_Rising高电平触发，EXTI_Trigger_Rising_Falling高低电平都行
	EXTI_Init(&EXTI_InitStruct);
	
	/*NVIC配置*/
	/*
	void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//这个是设置中断分组的
	void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);		   //这个是
	*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//这里设置的上述2个抢占，2个响应
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;			//这里是指定中断通道来开启或断开，因为我们选的14，所以EXTI15_10_IRQn开启
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;				//指定中断通道是使能还是不使能
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;		//这里是配置抢占优先级的是多少，不能超过配置分组的范围
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;				//这里是配置响应优先级是多少，不能超过配置分组的范围
	NVIC_Init(&NVIC_InitStruct);
}

uint16_t CountSensor_Get(void)
{
	return Count;
}


//中断程序，中断程序可以在启动文件里面找到（启动文件里面后缀是IRQHandler就是中断函数），然后我们这里是中断是EXTI15_10_IRQn口的中断，所以这么些
void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line14) == SET)					//看是不是有中断标志位，看我们配置的EXTI_Line14有没有中断，他的返回值是SET 和 RESET 
	{
		Count ++;
		EXTI_ClearITPendingBit(EXTI_Line14);					//进入中断之后标志位一定要清零，因为只要标志位置1了，就会跳到中断程序，所以不清0，就会一直跳到中断
	}
}
